import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;


public class ej38 {

	//Función Recursiva que va sacando las bolas según todas las combinaciones posibles y que muestra los resultados y los guarda en un archivo.
	public static void sacar_bola (String combinacion,int totales, int dinero, int negro, int rojo, int blanco, PrintWriter salida,int max,String archivo){
		
		if (dinero == max){ 	//Si alcanza el máximo de dinero, caso base 1
			System.out.println("Bolas "+combinacion+", \tVICTORIA por "+max);//Escribe cada vez, tanto por pantalla como en el fichero(si se ha activado).
			if(archivo.equals("nulo")!=true){
				salida.println("Bolas "+combinacion+", \tVICTORIA por "+max);
			}
		}
		else if (totales == 15){//Si alcanza el máximo de bolas, caso base 2
			System.out.println("Bolas "+combinacion+", \tVICTORIA por 15 BOLAS");
			if(archivo.equals("nulo")!=true){
				salida.println("Bolas "+combinacion+", \tVICTORIA por 15 BOLAS");
			}
		}
		else if (dinero > max){
			//Si te pasas del dinero no hace nada
		}
		else if (negro==0&&rojo==0&&blanco==0){
//			Si se acaban las bolas de todos los colores, tampoco muestra nada
			//Estos dos últimos "casos base" no haría falta ponerlos, sólo los he puesto
			//para aclararme y por comodidad.
		}
		else{					//En cualquier otro caso, sigue sacando bolas
			
			/* A la hora de sacar otra bola, vuelve a llamar a la función recursiva sacar_bola, pero
			 * le pasa los parámetros de forma distinta, al string combinación le añade una N,R,B dependiendo
			 * de la bola que haya sacado, suma uno al total de bolas, realiza la modificación al dinero
			 * dependiendo de la bola que haya sacado y disminuye en 1 el número de bolas de la clase que
			 * haya sacado, además le pasa también el fichero en el que deberá realizar la salida cuando pare
			 * la función recursiva.
			 */
			if (negro>0){
				sacar_bola(combinacion+"N",totales+1,dinero/2,negro-1, rojo, blanco, salida,max,archivo);
			}
			if (rojo>0){
				sacar_bola(combinacion+"R",totales+1,dinero+2000,negro, rojo-1, blanco, salida,max,archivo);
			}
			if (blanco>0){
				sacar_bola(combinacion+"B",totales+1,dinero*2,negro, rojo, blanco-1, salida,max,archivo);
			}
			
		}
	}
	
	
	public static void main(String[] args) throws IOException{

		int negro, rojo, blanco; //Cantidades de bolas iniciales de la urna.
		int max=15000; //Dinero máximo como condición para ganar
		char entrada;//String donde se almacenará lo introducido por teclado
		String RutaEntrada; //Ruta del archivo de entrada
		String RutaSalida; //Ruta del archivo de Salida
	
		InputStreamReader teclado; //Declaro la entrada de datos
		BufferedReader bufferLectura;//Declaro Buffer de entrada
		
		teclado = new InputStreamReader (System.in);//Paso al InputStreamReader la entrada de teclado 
		bufferLectura = new BufferedReader (teclado);//Se almacena en el buffer
		//Si se quiere cambiar el dinero máximo (por defecto 15000)
		System.out.print("¿Quiéres cambiar el dinero máximo[15.000]?(S/N): ");
		entrada= bufferLectura.readLine().toUpperCase().charAt(0);
		if(entrada=='S'){
			System.out.print("Nuevo valor: ");
			max = Integer.parseInt(bufferLectura.readLine());
		}
		
		//Se puede introducir las bolas de la urna por un archivo o manualmente por teclado
		do{
			System.out.print("Método para introducir la urna ([t]eclado / [a]rchivo): ");
			entrada = bufferLectura.readLine().toLowerCase().charAt(0);
			}
		while (entrada!='t'&&entrada!='a'); //Hasta que no introduzcas una opción válida para meter la urna no sigue.
		
		if(entrada=='t'){ //En el caso que elijas meterlo por teclado, te lo pide por pantalla el número de bolas
			System.out.println("\nIntroducción de la urna POR TECLADO");
			System.out.print("Bolas Negras de la Urna: ");
			negro = Integer.parseInt(bufferLectura.readLine());
			
			System.out.print("Bolas Rojas de la Urna: ");
			rojo = Integer.parseInt(bufferLectura.readLine());
			
			System.out.print("Bolas Blancas de la Urna: ");
			blanco = Integer.parseInt(bufferLectura.readLine());
		}
		else{ //En el caso de que le pidas la entrada de la urna por archivo
			System.out.println("La Urna debe estar en un fichero .txt con el siguiente formato:\n\t- Primera Línea: Número de Bolas Negras\n\t- Segunda Línea: Número de bolas Rojas\n\t- Tercera Línea: Número de Bolas Blancas");
			System.out.print("Introduzca la ruta del fichero con la urna: ");
			
			RutaEntrada=bufferLectura.readLine();
			FileReader EntradaA; //Creo el objeto de clase filereader
			EntradaA = new FileReader(RutaEntrada); //Le asigno la ruta del archivo
			//Se lo paso al constructor BufferedReader
			BufferedReader bufferArchivo;
			bufferArchivo = new BufferedReader(EntradaA);
			
			negro = Integer.parseInt(bufferArchivo.readLine());//Leo la primera línea, la convierto a un Entero y se lo asigno a las bolas negras
			blanco = Integer.parseInt(bufferArchivo.readLine());//Hago lo mismo con el resto de tipos de bolas
			rojo =Integer.parseInt(bufferArchivo.readLine());
			System.out.println("Bolas Negras: "+negro+"\nBolas Rojas: "+rojo+"\nBolas Blancas: "+blanco); //Muestra por pantalla el contenido de la Urna
			bufferArchivo.close(); //Cierra el archivo de entrada, ya que hemos terminado de trabajar con él.
		}
		//Selecciona si se quiere hacer la salida por archivo
		System.out.print("¿Quiéres la salida por archivo?(S/N): ");
		entrada= bufferLectura.readLine().toUpperCase().charAt(0);
		if(entrada=='S'){
//			Determina el fichero donde se va a producir la salida si se seleccionó salida por archivo
			System.out.println("\nÉste programa da la salida por pantalla y por un fichero, determine la ruta del fichero de salida");
			System.out.print("RUTA: ");
			RutaSalida = bufferLectura.readLine();//Lee la ruta de Salida.
		}
		else {
			RutaSalida = "nulo";
		}
		FileWriter fsalida;					//Declara el archivo de Salida
		fsalida = new FileWriter(RutaSalida); //Crea el objeto con la ruta
		PrintWriter salida;
		salida = new PrintWriter(fsalida); //Crea el flujo de datos para salida.
		//Llama a la función recursiva con los parámetros que le hemos introducido.
		sacar_bola("",0,1000,negro,rojo,blanco,salida,max,RutaSalida);
		/*Lo primero es el string vacío, ya que comienzas sin ninguna bola sacada
		 *Luego va el contador de bolas sacadas, también en 0
		 *1000 es el dinero inicial por defecto, se podría cambiar
		 *luego van las 3 cantidades de bolas que habremos leido por teclado/archivo
		 *Luego le pasas el objeto PrintWriter para qeu vaya escribiendo sucesivamente en el fichero de salida.
		 * */
		salida.println("PROGRAMA TERMINADO"); //Pone en el fichero que ha terminado.
		salida.close(); //Cierra el fichero de salida.
		System.out.println("PROGRAMA TERMINADO");//Muestra por pantalla que ha terminado.

	}

}